import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
import path from 'node:path'

// 配置函数，支持环境变量
export default defineConfig(({ command, mode }) => {
  // 加载环境变量
  const env = loadEnv(mode, process.cwd())

  // 检查是否使用mock模式
  const isMock = mode === 'mock';

  return {
    // 根据环境配置基础路径
    base: mode === 'production' ? '/' : '/',

    plugins: [
      vue(),
      vueDevTools(),
    ],

    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      },
    },

    server: {
      host: '0.0.0.0', // 支持局域网访问
      port: 3000,      // 指定端口
      proxy: isMock ? {} : { // mock模式不需要代理
        "/api": {
          // 根据环境变量选择目标地址
          target: mode === 'production'
            ? "http://117.72.52.207:8091"
            : "http://localhost:8091",
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, "")
        }
      }
    },

    build: {
      // 输出目录
      outDir: 'dist',

      // 优化构建配置
      chunkSizeWarningLimit: 1000, // 提高警告阈值
      assetsInlineLimit: 4096,     // 4KB 以下资源转为 DataURL
      cssCodeSplit: true,         // 启用 CSS 代码分割

      // 源码映射，便于调试
      sourcemap: mode === 'production' ? false : 'inline',

      // 压缩选项
      minify: 'terser',
      terserOptions: {
        compress: {
          drop_console: mode === 'production', // 生产环境下删除控制台日志
          drop_debugger: mode === 'production' // 生产环境下删除debugger
        }
      },

      // Rollup 打包配置
      rollupOptions: {
        output: {
          // 静态资源命名方式
          assetFileNames: 'assets/[name].[hash][extname]',
          chunkFileNames: 'js/[name].[hash].js',
          entryFileNames: 'js/[name].[hash].js',

          // 代码分割策略
          manualChunks(id) {
            if (id.includes('node_modules')) {
              // 将每个第三方库独立分包
              return id.toString().split('node_modules/')[1].split('/')[0]
            }
            // 将业务代码中的公共模块分组
            if (id.includes('src/utils')) return 'common-utils'
            if (id.includes('src/components')) return 'common-components'
          }
        }
      }
    }
  }
})
